# @author : sentry
# @since : 2025-03-30

"""
准备测试环境
mkdir C:\test_input
echo "test" > C:\test_input\log_2023-08-01.txt
echo "test" > C:\test_input\error_2023_08_02.csv

python E:\PycharmProjects\study-for-python\ai_family\file_rename.py --input "C:\test_input" --dry-run
"""
import argparse
import re
from pathlib import Path


def extract_date(filename):
    """
    从文件名中提取日期（支持YYYY-MM-DD或YYYY_MM_DD格式）
    返回格式统一的日期字符串（YYYY-MM-DD），若未找到则返回None
    """
    # 正则表达式匹配日期部分
    date_patterns = [
        r"(?P<year>\d{4})-(?P<month>\d{2})-(?P<day>\d{2})",  # YYYY-MM-DD
        r"(?P<year>\d{4})_(?P<month>\d{2})_(?P<day>\d{2})"  # YYYY_MM_DD
    ]
    for pattern in date_patterns:
        match = re.search(pattern, filename)
        if match:
            return f"{match.group('year')}-{match.group('month')}-{match.group('day')}"
    return None


def rename_files(input_dir, dry_run=False):
    """
    主逻辑：遍历文件、提取日期、重命名
    """
    input_path = Path(input_dir)
    if not input_path.exists():
        print(f"错误：目录不存在 - {input_dir}")
        return

    # 收集所有待处理的文件及其日期
    dated_files = []
    skipped_files = []

    for file in input_path.glob("*"):
        if file.is_file() and file.suffix.lower() in (".txt", ".csv"):
            date = extract_date(file.name)
            if date:
                dated_files.append((date, file))
            else:
                skipped_files.append(file.name)

    # 按日期排序（相同日期的文件按原始名称排序）
    # x[0]是日期，x[1]是文件路径
    # Java 等效代码（对比理解）
    # datedFiles.sort(Comparator
    #     .comparing(FileItem::getDate)
    #     .thenComparing(FileItem::getFileName));
    dated_files.sort(key=lambda x: (x[0], x[1].name))

    # 重命名操作
    renamed_count = 0
    for idx, (date, file) in enumerate(dated_files, 1):
        new_name = f"{date}_{idx}.log"
        new_path = file.parent / new_name

        if dry_run:
            print(f"[DRY RUN] {file.name} → {new_name}")
        else:
            try:
                file.rename(new_path)
                print(f"Renamed: {file.name} → {new_name}")
                renamed_count += 1
            except Exception as e:
                print(f"重命名失败: {file.name} (错误: {str(e)})")

    # 输出统计信息
    print("\n=== 执行结果 ===")
    print(f"找到文件: {len(dated_files) + len(skipped_files)} 个")
    print(f"成功重命名: {renamed_count} 个" if not dry_run else "预览模式完成")
    print(f"跳过无日期文件: {len(skipped_files)} 个")
    if skipped_files:
        print("跳过的文件列表:", ", ".join(skipped_files))


def main():
    # 命令行参数配置
    parser = argparse.ArgumentParser(
        description="文件批量重命名工具 - 按日期整理日志文件",
        formatter_class=argparse.ArgumentDefaultsHelpFormatter
    )
    # 注册参数规则
    parser.add_argument(
        "--input",
        # 声明需要这个参数
        required=True,
        help="输入目录路径"
    )
    parser.add_argument(
        "--dry-run",
        # 声明这是一个标志参数
        action="store_true",
        help="预览模式（不实际执行重命名）"
    )
    args = parser.parse_args()

    # 执行主逻辑
    rename_files(args.input, args.dry_run)


if __name__ == "__main__":
    main()
